#include "serverwidget.h"
#include "ui_serverwidget.h"
#include <QFileDialog>//文本对话框
#include <QDebug>
#include <QFileInfo>
#include <QMessageBox>

ServerWidget::ServerWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::ServerWidget)
{
    ui->setupUi(this);

    tcpServer = new QTcpServer(this);

//    设置按钮为不可按
    ui->buttonFile->setEnabled(false);
    ui->buttonSend->setEnabled(false);

    tcpServer->listen(QHostAddress::Any,7777);

    connect(tcpServer,&QTcpServer::newConnection,[=](){
//       取出待连接的下一个套接字
        tcpSocket = tcpServer->nextPendingConnection();

        QString ip = tcpSocket->peerAddress().toString();
        quint16 port = tcpSocket->peerPort();

        QString temp = QString("[%1:%2]已成功连接").arg(ip).arg(port);

        ui->textEdit->setText(temp);

//        设置选择文件按钮为可按
        ui->buttonFile->setEnabled(true);

        connect(tcpSocket,&QTcpSocket::readyRead,[=](){
           QByteArray arr = tcpSocket->readAll();

           if(QString(arr) == "file done"){//对方已经全部接收
               QMessageBox::information(this,"完毕","文件已全部发送完毕");

       //        断开服务器
               tcpSocket->disconnectFromHost();
               tcpSocket->close();
           }
        });
    });

    connect(&myTimer,&QTimer::timeout,[=](){
//        关闭定时器
        myTimer.stop();
//        发送文件
        sendData();
    });

}

ServerWidget::~ServerWidget()
{
    delete ui;
}


void ServerWidget::on_buttonFile_clicked()
{
    QString filePath = QFileDialog::getOpenFileName(this,"Open","../");
    if(filePath.isEmpty() == false){
    //    获取文件信息 QFileinfo
    QFileInfo info(filePath);

    fileName = info.fileName();
    fileSize = info.size();

    sendSize = 0; //发送文件大小为0
    //    打开文件为只读
    file.setFileName(filePath);
    bool isOK = file.open(QIODevice::ReadOnly);
    if(isOK == false){ //文件未成功打开
        qDebug() << "文件未成功打开 65";
    }

//    文件路径显示
    ui->textEdit->append(filePath);
    ui->buttonFile->setEnabled(false);
    ui->buttonSend->setEnabled(true);

    } else {
        qDebug() << "文件信息选择失败 57";
    }
}

void ServerWidget::on_buttonSend_clicked()
{
//    发送文件信息
    QString str = QString("%1##%2").arg(fileName).arg(fileSize);//可在客户端解包

    qint64 len = tcpSocket->write(str.toUtf8().data());//char*
    if(len > 0){//发送文件信息成功
//        发送真正文件内容
//        距离太近会产生黏包
//        用定时器延时解决黏包问题
        myTimer.start(20);//间隔20ms触发信号

    } else {
        qDebug() << "发送文件信息失败 95";
        file.close();

//        关闭TCP连接
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
    }
}

void ServerWidget::sendData(){
    qint64 len = 0;

    do{
        char buf[4*1024] = {0};
//        读文件内容
        len = file.read(buf,sizeof(buf));//读了多少文件
//        读多少发多少
        len = tcpSocket->write(buf,len);//返回已经发了多少

        sendSize += len;//已发送多少文件内容
    }while (len>0);

/*    if(sendSize == fileSize){//发送大小==文件大小 文件全部发送完成
//        ui->textEdit->append(QString("文件已全部发送完毕！"));
        QMessageBox::information(this,"完毕","文件已全部发送完毕");

//        断开服务器
        tcpSocket->disconnectFromHost();
        tcpSocket->close();
    }
*/
   }
